﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Portal.Xml.Utility;
using System.Collections.ObjectModel;

namespace Portal.Systems.Model
{
    public class PageCls
    {
        public string PageId;
        public string PageAlias;
        public string PageTitle;
        public string PageKeyword;
        public string AssetCode;
        public string DataLanguage;
        public int Active;
        public string PageOwner;
        public int SortIndex;
        public Collection<PageZoneCls> PageZones = new Collection<PageZoneCls> { };
    }

    public class PageParser
    {
        public static PageCls CreateInstance()
        {
            //tao 1 class trang....
            PageCls oPageCls = new PageCls();
            return oPageCls;
        }

        public static string GetXml(PageCls OPage)
        {
            DataSet ds = new DataSet("PageModuleLayout");
            ds.Tables.Add("Page");
            ds.Tables.Add("PageZone");
            ds.Tables.Add("PageZoneModule");

            ds.Tables["Page"].Columns.Add("PageId");
            ds.Tables["Page"].Columns.Add("PageAlias");
            ds.Tables["Page"].Columns.Add("PageTitle");
            ds.Tables["Page"].Columns.Add("PageKeyword");
            ds.Tables["Page"].Columns.Add("AssetCode");
            ds.Tables["Page"].Columns.Add("DataLanguage");
            ds.Tables["Page"].Columns.Add("Active");
            ds.Tables["Page"].Columns.Add("PageOwner");
            ds.Tables["Page"].Columns.Add("SortIndex");
            ds.Tables["Page"].Rows.Add(new object[]{
                OPage.PageId, OPage.PageAlias, OPage.PageTitle, OPage.PageKeyword, OPage.AssetCode, OPage.DataLanguage, OPage.Active, OPage.PageOwner, OPage.SortIndex
            });


            ds.Tables["PageZoneModule"].Columns.Add("ServiceId");
            ds.Tables["PageZoneModule"].Columns.Add("PageZoneModuleId");
            ds.Tables["PageZoneModule"].Columns.Add("PageZoneId");
            ds.Tables["PageZoneModule"].Columns.Add("ModuleId");
            ds.Tables["PageZoneModule"].Columns.Add("ModuleTitle");
            ds.Tables["PageZoneModule"].Columns.Add("AssetCode");
            ds.Tables["PageZoneModule"].Columns.Add("DataLanguage");
            ds.Tables["PageZoneModule"].Columns.Add("Visible");
            ds.Tables["PageZoneModule"].Columns.Add("SortIndex");
            ds.Tables["PageZoneModule"].Columns.Add("PageId");
            ds.Tables["PageZoneModule"].Columns.Add("PlugInViewId");
            ds.Tables["PageZoneModule"].Columns.Add("CssClass");
            ds.Tables["PageZoneModule"].Columns.Add("XmlDataConfig");


            ds.Tables["PageZone"].Columns.Add("PageZoneId");
            ds.Tables["PageZone"].Columns.Add("ZoneAlias");
            ds.Tables["PageZone"].Columns.Add("ZoneName");
            ds.Tables["PageZone"].Columns.Add("AssetCode");
            ds.Tables["PageZone"].Columns.Add("DataLanguage");
            ds.Tables["PageZone"].Columns.Add("PageId");
            ds.Tables["PageZone"].Columns.Add("Active");
            for (int iIndexZone = 0; iIndexZone < OPage.PageZones.Count; iIndexZone++)
            {
                ds.Tables["PageZone"].Rows.Add(new object[]{
                    OPage.PageZones[iIndexZone].PageZoneId,
                    OPage.PageZones[iIndexZone].ZoneAlias,
                    OPage.PageZones[iIndexZone].ZoneName,
                    OPage.PageZones[iIndexZone].AssetCode,
                    OPage.PageZones[iIndexZone].DataLanguage,
                    OPage.PageZones[iIndexZone].PageId,
                    OPage.PageZones[iIndexZone].Active,
                });

                for (int iIndexPageZone = 0; iIndexPageZone < OPage.PageZones[iIndexZone].PageZoneModules.Count; iIndexPageZone++)
                {
                    ds.Tables["PageZoneModule"].Rows.Add(new object[]{
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].ServiceId,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].PageZoneModuleId,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].PageZoneId,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].ModuleId,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].ModuleTitle,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].AssetCode,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].DataLanguage,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].Visible,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].SortIndex,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].PageId,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].PlugInViewId,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].CssClass,
                        OPage.PageZones[iIndexZone].PageZoneModules[iIndexPageZone].XmlDataConfig,
                    });
                }
            }
            return ds.GetXml();
        }

        public static PageCls ParseFromXml(string XmlData)
        {
            DataSet ds = XmlUtility.GetDataSetFromXml(XmlData);
            PageCls OPage = ParseFromDataRow(ds.Tables[0].Rows[0]);
            //doan nay page them zone...!
            if (ds.Tables["PageZone"] != null)
            {
                DataTable dtPageZone = ds.Tables["PageZone"];
                PageZoneCls[] PageZones=PageZoneParser.ParseFromDataTable(dtPageZone);
                for (int iIndexZone = 0; iIndexZone < PageZones.Length; iIndexZone++)
                {
                    OPage.PageZones.Add(PageZones[iIndexZone]);
                }
            }
            if (ds.Tables["PageZoneModule"] != null)
            {
                DataTable dtPageZoneModule = ds.Tables["PageZoneModule"];
                for(int iIndex=0;iIndex<OPage.PageZones.Count;iIndex++)
                {
                    OPage.PageZones[iIndex].PageZoneModules = new Collection<PageZoneModuleCls> { };
                    DataView dv = new DataView(dtPageZoneModule, "PageZoneId='" + OPage.PageZones[iIndex].PageZoneId + "'", "", DataViewRowState.CurrentRows);
                    for (int iIndexPageZone = 0; iIndexPageZone < dv.Count; iIndexPageZone++)
                    {
                        PageZoneModuleCls OPageZoneModule = PageZoneModuleParser.ParseFromDataRowView(dv[iIndexPageZone]);
                        OPage.PageZones[iIndex].PageZoneModules.Add(OPageZoneModule);
                    }
                }
            }
            return OPage;
        }


        public static PageCls ParseFromDataRow(DataRow dr)
        {
            PageCls OPageCls = new PageCls();
            OPageCls.PageId = XmlUtility.GetString(dr, "PageId", true);
            OPageCls.PageAlias = XmlUtility.GetString(dr, "PageAlias", true);
            OPageCls.PageTitle = XmlUtility.GetString(dr, "PageTitle", true);
            OPageCls.PageKeyword = XmlUtility.GetString(dr, "PageKeyword", true);
            OPageCls.AssetCode = XmlUtility.GetString(dr,"AssetCode",true);
            OPageCls.DataLanguage = XmlUtility.GetString(dr, "DataLanguage", true);
            OPageCls.Active = XmlUtility.GetInt(dr, "Active",true);
            OPageCls.SortIndex = XmlUtility.GetInt(dr, "SortIndex", true);

            return OPageCls;
        }

        public static PageCls[] ParseFromDataTable(DataTable dtTable)
        {
            PageCls[] Pages = new PageCls[dtTable.Rows.Count];
            for (int iIndex = 0; iIndex < dtTable.Rows.Count; iIndex++)
            {
                Pages[iIndex] = ParseFromDataRow(dtTable.Rows[iIndex]);
            }

            return Pages;
        }
    }
}


